0225. 用队列实现栈【简单】
1. 📝 题目描述
请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)。
实现 MyStack 类:
void push(int x)将元素 x 压入栈顶。int pop()移除并返回栈顶元素。int top()返回栈顶元素。boolean empty()如果栈是空的,返回true;否则,返回false。
注意:
- 你只能使用队列的标准操作 —— 也就是
push to back、peek/pop from front、size和is empty这些操作。 - 你所使用的语言也许不支持队列。 你可以使用 list (列表)或者 deque(双端队列)来模拟一个队列 , 只要是标准的队列操作即可。
示例:
txt
输入:
["MyStack", "push", "push", "top", "pop", "empty"]
[[], [1], [2], [], [], []]
输出:
[null, null, null, 2, 2, false]
解释:
MyStack myStack = new MyStack();
myStack.push(1);
myStack.push(2);
myStack.top(); // 返回 2
myStack.pop(); // 返回 2
myStack.empty(); // 返回 False1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
提示:
1 <= x <= 9- 最多调用
100次push、pop、top和empty - 每次调用
pop和top都保证栈不为空
进阶:你能否仅用一个队列来实现栈。
2. 🎯 s.1 - 暴力解法
js
var MyStack = function () {
this.queue = []
}
/**
* @param {number} x
* @return {void}
*/
MyStack.prototype.push = function (x) {
const n = this.queue.length
this.queue.push(x)
// 将新元素前面的所有元素重新入队,让新元素到队首
for (let i = 0; i < n; i++) {
this.queue.push(this.queue.shift())
}
}
/**
* @return {number}
*/
MyStack.prototype.pop = function () {
return this.queue.shift()
}
/**
* @return {number}
*/
MyStack.prototype.top = function () {
return this.queue[0]
}
/**
* @return {boolean}
*/
MyStack.prototype.empty = function () {
return this.queue.length === 0
}
/**
* Your MyStack object will be instantiated and called as such:
* var obj = new MyStack()
* obj.push(x)
* var param_2 = obj.pop()
* var param_3 = obj.top()
* var param_4 = obj.empty()
*/1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
- 时间复杂度:
push操作 ,其他操作 - 空间复杂度:
,存储 n 个元素
算法思路:
- 使用一个队列,通过调整元素顺序实现栈的后进先出
push时将新元素入队后,把前面的元素依次出队再入队,使新元素位于队首pop和top直接操作队首元素empty检查队列是否为空